#include <iostream>
#include <string>
using namespace std;

//通过全局函数 打印Person的信息

//提前让编译器知道Person类的存在
template<class T1, class T2>
class Person;

//类外实现
template<class T1, class T2>
void printPerson2(Person<T1, T2> p)
{
    cout << "类外实现 -- 姓名：" << p.name << endl;
    cout << "类外实现 -- 年龄：" << p.age << endl;
}

template<class T1, class T2>
class Person
{
    //全局函数 类内实现
    friend void printPerson(Person<T1, T2> p)
    {
        cout << "姓名：" << p.name << endl;
        cout << "年龄：" << p.age << endl;
    }

    //全局函数 类外实现
    //加空模版参数列表
    //如果全局函数 是类外实现，需要让编译器提前知道这个函数的存在
    friend void printPerson2<>(Person<T1, T2> p);
    
public:
    T1 name;
    T2 age;

    Person(T1 name, T2 age)
    {
        this->name = name;
        this->age = age;
    }
};



//1、全局函数的类内实现
void test1()
{
    Person<string, int> p("猪八戒", 999);
    printPerson(p);
}

//2、全局函数的类外实现
void test2()
{
    Person<string, int> p("孙悟空", 9999);
    printPerson2(p);
}

int main()
{
    test1();
    cout << "------------------" << endl;
    test2();
    
    return 0;
}